package com.sky.controller.admin;

import com.sky.dto.DishDTO;
import com.sky.dto.DishPageQueryDTO;
import com.sky.entity.Dish;
import com.sky.result.PageResult;
import com.sky.result.Result;
import com.sky.service.DishService;
import com.sky.vo.DishVO;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Set;

@RestController
@Slf4j
@RequestMapping("/admin/dish")
public class DishController {
    //注意我们的项目设置了统一响应结果是泛型类 然后如果是查询接口才要指定我们的返回类型
    @Autowired
    private DishService dishService;

    //我们在管理端的每次操作都把我们的缓存清除(有操作的key删除) 然后这样我们的操作后 用户端就会重新读取缓存
    @Autowired
    private RedisTemplate redisTemplate;
    /**
     * 新增菜品
     * 使用DTO来接受请求参数
     * @param dish
     * @return
     */
    @PostMapping
    @ApiOperation("新增菜品")
    public Result addDish(@RequestBody DishDTO dish) {
        //构造我们受影响的key(注意我们redis中数据库key的id是根据种类分的)
        String key="dish_"+dish.getCategoryId();
        redisTemplate.delete(key);
        dishService.addDish(dish);
        return Result.success();
    }

    /**
     * 菜品分页查询
     * 请求路径按照了Restful规范 还使用了统一响应结果
     * @param pagedto
     * @return
     */
    @GetMapping("/page")
    @ApiOperation("菜品分页查询")
    public Result<PageResult> page(DishPageQueryDTO pagedto) {
        log.info("菜品分页查询{}", pagedto);
        PageResult pageresult=dishService.pagesearch(pagedto);
        return Result.success(pageresult);
    }

    /**
     * 批量删除菜品
     * 这里的id是菜品id
     * @param ids
     * @return
     */
    @DeleteMapping
    @ApiOperation("批量删除菜品")
    //这里我们接收到Query 利用分割的api来接收对应的id
    public Result deleteDish(@RequestParam List<Long> ids) {
        dishService.delete(ids);
        //我们要获得我们的种类id(我们的批量查询返回的vo中有对应的categoryid 我们就可以通过这个来实现批量种类的删除)
        //暴力法(直接删除所有的菜品缓存)
        //根据我们的形参一个个方法下去获得对应的categoryid 然后删除这个分类下的所有value
        //这里我们先使用暴力法
        Set keys = redisTemplate.keys("dish_*");
        redisTemplate.delete(keys);
        return Result.success();
    }

    /**
     * 根据id查询菜品
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    @ApiOperation("根据id查询菜品")
    public Result<DishVO> getDishById(@PathVariable Long id ) {
        log.info("根据id查询菜品{} ",id);
        DishVO dvo=dishService.dishbyid(id);
        return Result.success(dvo);
    }

    /**
     * 修改菜品
     * @param dish
     * @return
     */
    @PutMapping
    @ApiOperation("修改菜品")
    public Result updateDish(@RequestBody DishDTO dish) {
        log.info("修改菜品{}", dish);
        dishService.update(dish);
        Set keys = redisTemplate.keys("dish_*");
        redisTemplate.delete(keys);
        return Result.success();
    }

    /**
     * 根据分类id查询菜品
     * @return
     */
    @GetMapping("/list")
    @ApiOperation("根据分类id查询菜品")
    public Result<List<Dish>> typesearch(Long id){
        log.info("根据分类id查询菜品{}",id);
        List<Dish> list = dishService.typesearch(id);
        return Result.success(list);
    }

    @PostMapping("/status/{status}")
    @ApiOperation("菜品的起售禁售设置")
    //这里根据我们的接口文档 我们有两个请求参数
    public Result updateDishStatus(@PathVariable Integer status,Long id) {
        dishService.updateStatus(status,id);
        Set keys = redisTemplate.keys("dish_*");
        redisTemplate.delete(keys);
        return Result.success();
    }


}
